#include "ControlRPCCliente.h"

ControlRPCCliente::ControlRPCCliente(const char* host){
    this->host = strdup(host);
    cliente = NULL;
}

int ControlRPCCliente::iniciarSesion(long idUsuario){
    printf("Inicio de sesion, usuario: %ld\n", idUsuario);

    bool_t  *result_1;

    result_1 = iniciarsesion_1(&idUsuario, getCliente());
    if (result_1 == (bool_t *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }

    return *result_1;
}

void ControlRPCCliente::cerrarSesion(long idUsuario){
    printf("Fin de sesion, usuario: %ld\n", idUsuario);
    
    void  *result_2;

    result_2 = cerrarsesion_1(&idUsuario, getCliente());
    if (result_2 == (void *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }
}

/* char * *result_3; */
/* long  obtenernombreusuario_1_arg = 1; */

/* result_3 = obtenernombreusuario_1(&obtenernombreusuario_1_arg, clnt); */
/* if (result_3 == (char **) NULL) { */
/*     clnt_perror (clnt, "call failed"); */
/* } */


lista ControlRPCCliente::obtenerParticipantesConversacion(long idConversacion){
    printf("Pido participantes de la conversacion %ld\n", idConversacion);
    
    lista  *result_4;

    result_4 = obtenerparticipantesconversacion_1(&idConversacion, getCliente());
    if (result_4 == (lista *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }

    return *result_4;
}

lista ControlRPCCliente::obtenerListaConversaciones(){
    printf("Pido la lista de conversaciones\n");

    lista  *result_5;
    char *obtenerlistaconversaciones_1_arg;

    result_5 = obtenerlistaconversaciones_1((void*)&obtenerlistaconversaciones_1_arg, getCliente());
    if (result_5 == (lista *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }

    return *result_5;
}

int ControlRPCCliente::unirseAConversacion(long idUsuario, long idConversacion){
    printf("Usuario %ld se una a la conversacion %ld\n", idUsuario, idConversacion);

    bool_t  *result_6;
    UsuarioConversacion  unirseaconversacion_1_arg;
    unirseaconversacion_1_arg.idUsuario = idUsuario;
    unirseaconversacion_1_arg.idConversacion = idConversacion;

    result_6 = unirseaconversacion_1(&unirseaconversacion_1_arg, getCliente());
    if (result_6 == (bool_t *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }

    return *result_6;
}

void ControlRPCCliente::abandonarConversacion(long idUsuario, long idConversacion){
    printf("Usuario %ld sale de la conversacion %ld\n", idUsuario, idConversacion);
    void  *result_7;
    UsuarioConversacion  abandonarconversacion_1_arg;
    abandonarconversacion_1_arg.idUsuario = idUsuario;
    abandonarconversacion_1_arg.idConversacion = idConversacion;

    result_7 = abandonarconversacion_1(&abandonarconversacion_1_arg, getCliente());
    if (result_7 == (void *) NULL) {
	clnt_perror (getCliente(), "call failed");
    }
}

CLIENT* ControlRPCCliente::getCliente(){
    if(cliente == NULL){
	cliente = clnt_create (host, CONTROLCENTRAL, CONTROLCENTRALVERSION1, "tcp");
	if (cliente == NULL) {
		clnt_pcreateerror (host);
		exit (1);
	}

    }
    return cliente;
}

ControlRPCCliente::~ControlRPCCliente(){
    clnt_destroy(getCliente());
    free(host);
}
